﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using AccesoData.Interfaces;
using Entidades;
using MySql.Data.MySqlClient;

namespace AccesoData.DAOMySql
{
    class DAOCLienteMySql:ConexionBaseDatos, IDAOCliente
    {
        /// <summary>
        /// agrega un cliente en la base de datos
        /// </summary>
        /// <param name="miCliente"></param>
        /// <returns></returns>
        public int AgregarCliente(Cliente miCliente)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "AgregarCliente";
  
                comando.Parameters.AddWithValue("@rif", miCliente.Rif);
                comando.Parameters.AddWithValue("@letraRif", miCliente.LetraRif);
                comando.Parameters.AddWithValue("@nombre", miCliente.Nombre);
                comando.Parameters.AddWithValue("@telefono1", miCliente.Telefono);
                comando.Parameters.AddWithValue("@telefono2", miCliente.Telefono1);
                comando.Parameters.AddWithValue("@telefono3", miCliente.Telefono2);

                comando.Parameters["@rif"].Direction = ParameterDirection.Input;
                comando.Parameters["@letraRif"].Direction = ParameterDirection.Input;
                comando.Parameters["@nombre"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefono1"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefono2"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefono3"].Direction = ParameterDirection.Input;
                int id = 0;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
                }

                CerrarConexion();
                return id;
            }
            catch (Exception)
            {

                return -1;
            }
        }

        /// <summary>
        /// obtiene los datos de un cliente dado su id
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        public Cliente ObtenerCliente(int idCliente)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                Cliente miCliente = FabricaEntidades.ObtenerCliente();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerCliente";
                comando.Parameters.AddWithValue("@idCliente", idCliente);
                comando.Parameters["@idCliente"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    miCliente.Id = (int)reader[0];
                    miCliente.Rif = (int)reader[1];
                    miCliente.LetraRif = reader.GetChar(2);
                    miCliente.Nombre = (string) reader[3];
                    miCliente.Telefono = (string)reader[4];
                    miCliente.Telefono1 = (string)reader[5];
                    miCliente.Telefono2 = (string)reader[6];
                }
                return miCliente;


            }
            catch (Exception)
            {

                return null;
            }
        }

        /// <summary>
        /// edita los datos de un cliente
        /// </summary>
        /// <param name="miCliente"></param>
        /// <returns></returns>
        public bool EditarCliente(Cliente miCliente)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "EditarCliente";

                comando.Parameters.AddWithValue("@rifNuevo", miCliente.Rif);
                comando.Parameters.AddWithValue("@letraRifNuevo", miCliente.LetraRif);
                comando.Parameters.AddWithValue("@nombreNuevo", miCliente.Nombre);
                comando.Parameters.AddWithValue("@telefono1Nuevo", miCliente.Telefono);
                comando.Parameters.AddWithValue("@telefono2Nuevo", miCliente.Telefono1);
                comando.Parameters.AddWithValue("@telefono3Nuevo", miCliente.Telefono2);
                comando.Parameters.AddWithValue("@idCliente", miCliente.Id);

                comando.Parameters["@rifNuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@letraRifNuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@nombreNuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefono1Nuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefono2Nuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefono3Nuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@idCliente"].Direction = ParameterDirection.Input;
                comando.ExecuteNonQuery();

                CerrarConexion();
                return true;

            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// eliminar un cliente de la base de datos
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        public bool EliminarCliente(int idCliente)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// obtiene una lista de cliente dado el identificador de una aseguradora
        /// </summary>
        /// <param name="idAseguradora"></param>
        /// <returns></returns>
        public List<Cliente> ObtenerListaCliente(int idAseguradora)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Cliente> retorno = new List<Cliente>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerClienteAseguradora";
                comando.Parameters.AddWithValue("@idAseguradora", idAseguradora);
                comando.Parameters["@idAseguradora"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    Cliente miCliente = FabricaEntidades.ObtenerCliente();
                    miCliente.Id = (int)reader[0];
                    miCliente.Rif = (int)reader[1];
                    miCliente.LetraRif = reader.GetChar(2);
                    miCliente.Nombre = (string)reader[3];
                    miCliente.Telefono = (string)reader[4];
                    miCliente.Telefono1 = (string)reader[5];
                    miCliente.Telefono2 = (string)reader[6];
                    retorno.Add(miCliente);
                }
                return retorno;
            }
            catch (Exception)
            {

                return null;
            }
        }

        /// <summary>
        /// Obtiene una lista de cliente dado el nombre de este
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public List<Cliente> ObtenerClienteNombre(string nombre)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Cliente> retorno = new List<Cliente>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerClienteNombre";
                comando.Parameters.AddWithValue("@nombreCliente", nombre);
                comando.Parameters["@nombreCliente"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    Cliente miCliente = FabricaEntidades.ObtenerCliente();
                    miCliente.Id = (int)reader[0];
                    miCliente.Rif = (int)reader[1];
                    miCliente.LetraRif = reader.GetChar(2);
                    miCliente.Nombre = (string)reader[3];
                    miCliente.Telefono = (string)reader[4];
                    miCliente.Telefono1 = (string)reader[5];
                    miCliente.Telefono2 = (string)reader[6];
                    retorno.Add(miCliente);
                }
                return retorno;
            }
            catch (Exception)
            {

                return null;
            }
        }
        /// <summary>
        /// Obtiene Lista de cliente dado el numero del rif
        /// </summary>
        /// <param name="numero"></param>
        /// <returns></returns>
        public List<Cliente> ObtenerClienteNumeroRif(int numero)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Cliente> retorno = new List<Cliente>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerClienteRif";
                comando.Parameters.AddWithValue("@rifCliente", numero);
                comando.Parameters["@rifCliente"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    Cliente miCliente = FabricaEntidades.ObtenerCliente();
                    miCliente.Id = (int)reader[0];
                    miCliente.Rif = (int)reader[1];
                    miCliente.LetraRif = reader.GetChar(2);
                    miCliente.Nombre = (string)reader[3];
                    miCliente.Telefono = (string)reader[4];
                    miCliente.Telefono1 = (string)reader[5];
                    miCliente.Telefono2 = (string)reader[6];
                    retorno.Add(miCliente);
                }
                return retorno;
            }
            catch (Exception)
            {

                return null;
            }
            
        }
    }
}
